home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 20 / Cream of the Crop 20 (Terry Blount) (1996).iso / program / vol15n11.zip / REXBOX.ZIP / REXXBOX.CMD < prev    next >
OS/2 REXX Batch file  |  1996-02-12  |  40KB  |  1,278 lines

  1. /********************************************************
  2. *                REXXBox 
  3. *              A CD Player for REXX
  4. *
  5. * It supports playplist, pause, resume, track display
  6. * author and title display, error detection
  7. *
  8. * It supports the following command line options
  9. *
  10. *   Prints a wide variety of information about the CD.
  11. *   1. The artist and CD title
  12. *   2. The songs on the disc, their length and their order in the playlist
  13. *   3. The current volume, and output type
  14. *   4. A menu of choices during playback
  15. *
  16. * /O for output.  Lets you chose how the audio will be heard.
  17. *   Possible options are:                                                    
  18. *   1. Headphones (front of CD or audio connector)                           
  19. *   2. Sound card (digital music transfer to your sound card)--CPU intensive!
  20. *
  21. * /P to change a playlist.  Allows you to change the order songs are played
  22. *
  23. * /H for help.    Will give you help using the REXXbox
  24. *
  25. * /C for color.   Turns off colors (ANSI mode).  In case you are color blind
  26. *                or have a buggy display driver.                             
  27. *
  28. * /S for quiet.  Will display absolutely no instructions. Useful for batch mode
  29. *********************************************************************************/
  30.  
  31. PlaylistExists = 'FALSE'
  32. volume    = 100
  33. outputset = 'FALSE'
  34. outputdir = 'headphones'
  35. env = 'OS2ENVIRONMENT'
  36. ansisupport = 'ON'
  37. animation = 1
  38. delay = 1
  39.  
  40. SIGNAL ON ERROR /* When commands fail, call "error" routine. */
  41.  
  42. /*  load system utility functions to access ANSI and cursor functions */
  43.  
  44. call rxfuncadd sysloadfuncs, rexxutil, sysloadfuncs
  45. call rxfuncadd SysTextScreenSize, rexxutil, SysTextScreenSize
  46. call rxfuncadd SysCurPos, rexxutil, SysCurPos
  47.  
  48. /* Call routine to determine if we are running in a session with ANSI */
  49. /* support (i.e. supports colors, cursor control etc.)                */
  50.  
  51. ansisupport = TestANSI()
  52. if ansisupport = 'ON' then
  53.    parse value SysTextScreenSize() with screenrow screencol
  54.  
  55. parse arg arg1 arg2 arg3 arg4 arg5
  56.  
  57. /* If the user asks for help, display options and then quit */
  58.  
  59. If (arg1 = '/?' | arg1 = '/h' | arg1 = '/?') THEN
  60.    do
  61.      DisplayHelpOptions()
  62.    End
  63. Else
  64.   Do
  65.   verbose = FALSE
  66.   output  = FALSE
  67.   playlistchange = FALSE
  68.   End
  69.  
  70. /* we support up to five simultaneous options -- see  DisplayHelpOptions */
  71.  
  72. rc = ParseArgs(arg1 )
  73. rc = ParseArgs(arg2 )
  74. rc = ParseArgs(arg3 )
  75. rc = ParseArgs(arg4 )
  76. rc = ParseArgs(arg5 )
  77.  
  78. /* Load multimedia functions */
  79.  
  80. rc = RXFUNCADD('mciRxInit','MCIAPI','mciRxInit')
  81. InitRC = mciRxInit()
  82.  
  83. /* Open the CD */
  84.  
  85. rc = mciRxSendString("open cdaudio alias supercd wait", 'Retst', '0', '0')
  86.  
  87. /* The following routine makes sure a CD is in the CD-ROM drive */
  88. /* REXXbox can not function without some type of a CD           */
  89.  
  90. rc = EnsureCDInDrive('TRUE')
  91.  
  92. /* Obtain the unique product ID associated with the CD */
  93.  
  94. rc = mciRxSendString("info supercd id wait", cdIndentifier, '0', '0')
  95. call sysloadfuncs
  96.  
  97. /* Get the directory where the REXXBOX.INI file is located */
  98.  
  99. rc = GetHome()
  100.  
  101. /* Now, check to see if the product id for this CD is stored in the INI file */
  102. /* If we haven't seen this CD before, we won't have the information in the   */
  103. /* INI file                                                                  */
  104.  
  105. cdkey = SysIni(mmhome, cdIndentifier, 'Artist')
  106.  
  107. IF cdkey \= 'ERROR:' THEN
  108.   do
  109.     /* This CD's description is in the INI file */
  110.     /* Find out the number of tracks, artist and title */
  111.  
  112.     NumTracks = SysIni(mmhome, cdIndentifier, 'NumTracks' )
  113.     if verbose = 'TRUE' THEN
  114.       do
  115.           /* Display the information in color if ANSI support is available */
  116.  
  117.           if ansisupport = 'ON' then
  118.             do
  119.              call charOut ,  LEFT('Artist is:', 19 )      || "1B"x || "[36;40m" || SysIni(mmhome, cdIndentifier, 'Artist') || "1B"x || "[0m"
  120.              say ''
  121.              call charOut ,  LEFT('Title is: ', 19 )      || "1B"x || "[36;40m" || SysIni(mmhome, cdIndentifier, 'Title') || "1B"x || "[0m"
  122.              say ''
  123.              call charOut ,  LEFT('Number of tracks:', 19)|| "1B"x || "[36;40m" || NumTracks || "1B"x || "[0m"
  124.              say ''
  125.              say ''
  126.             END
  127.          else /* we must display plain/jane text descriptions */
  128.            do
  129.              say  LEFT('Artist is:', 19 )       SysIni(mmhome, cdIndentifier, 'Artist')
  130.              say  LEFT('Title is: ', 19 )       SysIni(mmhome, cdIndentifier, 'Title')
  131.              say  LEFT('Number of tracks:', 19) NumTracks
  132.            END
  133.       END
  134.  
  135.     /* Setup default playlist */
  136.     /* The playlist is the order that the music will be played */
  137.     /* Unless the user specifies otherwise, we will play it sequentially */
  138.  
  139.     do loop = 0 to NumTracks
  140.        Playlist.loop = loop
  141.     END
  142.  
  143.     maxnamelen = 0
  144.     /* Now, load the names associated with each track on the CD */
  145.     /* The user gave us this information the first time the CD was inserted */
  146.  
  147.     do loop = 1 to NumTracks
  148.       TrackKey = 'TrackName:' loop
  149.       TrackName.loop = SysIni(mmhome, cdIndentifier, TrackKey );
  150.  
  151.       if LENGTH(TrackName.loop ) > maxnamelen  THEN
  152.          maxnamelen = LENGTH(TrackName.loop )
  153.     END
  154.  
  155.     /* Figure out if the caller has a playlist setup */
  156.  
  157.     PlaylistExists = SysIni(mmhome, cdIndentifier, 'Playlist' )
  158.  
  159.     if PlaylistExists = 'ERROR:' THEN
  160.       PlaylistExists = FALSE
  161.     ELSE
  162.       do
  163.          NumSongs = SysIni(mmhome, cdIndentifier, 'PlaylistTracks')
  164.          /* If the playlist exists, but we can't figure out the number of songs */
  165.          /* then, tell the user they have a corrupt REXXBOX.INI file.           */
  166.  
  167.          if NumSongs = 'ERROR:' THEN
  168.             do
  169.               say 'Configuration error--rexxbox.ini is corrupt'
  170.             END
  171.          ELSE
  172.             /* Load the order of the playlist based on the total # of songs */
  173.  
  174.             do loop = 1 to NumSongs
  175.               TrackKey = 'PlayTrackName:' loop
  176.               Playlist.loop = SysIni(mmhome, cdIndentifier, TrackKey)
  177.             END
  178.  
  179.       END
  180.  
  181.    volume = SysIni(mmhome, cdIndentifier, 'Volume' )
  182.  
  183.    /* if there is a bad ini value or if its not there--try to recover */
  184.  
  185.    if  volume = 'ERROR:' THEN
  186.      volume = 100
  187.  
  188.    /* The user can have the output routed to either:
  189.    *    the headphones (front panel/audio connector)
  190.    *    or the sound card (via digital transfer)
  191.    *
  192.    * Figure out which setting the user chose last time we ran.
  193.    */
  194.  
  195.    outputdir = SysIni(mmhome, cdIndentifier, 'outputdir' )
  196.    if  outputdir = 'ERROR:' THEN
  197.      do
  198.      outputdir = 'headphones'
  199.      say 'error getting output direction from REXXBOX.INI file'
  200.      END
  201.  
  202.   END
  203. ELSE /* We've never seen this CD before--find out artist/title info from user */
  204.   do
  205.     say 'Unknown CD--which artist recorded this CD?'
  206.     pull artist.0
  207.     say 'What is the title of the CD?'
  208.     pull artist.1
  209.  
  210.     /* Place this information in the REXXBOX.INI file */
  211.  
  212.     iniRc = SysIni(mmhome, cdIndentifier, 'Artist', artist.0 )
  213.     iniRc = SysIni(mmhome, cdIndentifier, 'Title',  artist.1 )
  214.  
  215.     /* Figure out how many tracks are on the CD */
  216.  
  217.     rc = mciRxSendString("status supercd number of tracks wait", 'NumTracks', '0', '0')
  218.  
  219.     if rc <> 0 THEN
  220.       do
  221.       say 'error getting number of tracks'
  222.  
  223.       /* Default to 1 track */
  224.  
  225.       iniRc = SysIni(mmhome, cdIndentifier, 'NumTracks',  1 )
  226.       END
  227.     ELSE
  228.       do
  229.       /* Save the total number of tracks */
  230.  
  231.       iniRc = SysIni(mmhome, cdIndentifier, 'NumTracks',  NumTracks )
  232.  
  233.       maxnamelen = 0
  234.  
  235.         /* Find out the name of each track */
  236.  
  237.         do loop = 1 to NumTracks
  238.           say 'Enter name for track: 'loop ': '
  239.           pull TrackName.loop
  240.           TrackKey = 'TrackName:' loop
  241.           iniRc = SysIni(mmhome, cdIndentifier, TrackKey,  TrackName.loop )
  242.  
  243.           if LENGTH(TrackName.loop ) > maxnamelen  THEN
  244.              maxnamelen = LENGTH(TrackName.loop )
  245.         END
  246.       END
  247.  
  248.     /* Indicate that we haven't create